package com.hk.mybatis.query;

import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

/**
 * 结果。
 *
 * @param <T> 结果集内容的类型
 */
@Builder
@NoArgsConstructor
@Getter
@Setter
public class Result<T> {

    /**
     * 结果状态码：成功
     */
    public static final int STATUS_OK = 1;
    /**
     * 结果状态码：失败
     */
    public static final int STATUS_FAILED = 0;

    /**
     * 默认返回结果消息：操作成功
     */
    public static final String DEFAULT_MESSAGE = "操作成功";

    /**
     * 状态
     */
    @Builder.Default
    private int status = STATUS_OK;

    /**
     * 结果消息
     */
    @Builder.Default
    private String message = DEFAULT_MESSAGE;

    /**
     * 返回内容
     */
    private T content;

    /**
     * 初始化实例。
     *
     * @param content 内容
     */
    public Result(T content) {
        this.content = content;
    }

    /**
     * 构造方法
     *
     * @param status  状态
     * @param message 结果消息
     */
    public Result(int status, String message) {
        this.status = status;
        this.message = message;
    }

    /**
     * 结果
     * 初始化实例。
     *
     * @param status  状态
     * @param content 内容
     * @param message 消息
     */
    public Result(int status, String message, T content) {
        this.message = message;
        this.status = status;
        this.content = content;
    }

    /**
     * 初始化实例。
     *
     * @param status  状态
     * @param content 内容
     */
    public Result(int status, T content) {
        this.status = status;
        this.content = content;
    }

    /**
     * 处理失败时结果。
     *
     * @param message 消息
     * @return {@link Result}对象
     */
    public static <T> Result<T> fail(String message) {
        return new Result<>(STATUS_FAILED, message);
    }

    /**
     * 处理成功时结果。
     *
     * @param content 内容
     * @return {@link Result<T>}对象
     */
    public static <T> Result<T> success(T content) {
        return new Result<>(content);
    }

    /**
     * 处理成功时结果。
     *
     * @param content 内容
     * @param message 消息
     * @return {@link Result<T>}对象
     */
    public static <T> Result<T> success(T content, String message) {
        Result<T> result = new Result<>(content);
        result.setMessage(message);
        return result;
    }
}
